/*
 * Query.h
 *
 *  Created on: 2020年12月13日
 *      Author: san
 */

#ifndef QUERY_H_
#define QUERY_H_

#include <string>
#include <memory>
#include <iostream>

#include "Querybase.h"
//#include "QueryResult.h"
#include "TextQuery.h"
#include "WordQuery.h"

class TextQuery;
class Query {
	// 这些运算符需要访问接受shared_ptr的构造函数，而该函数是私有的
	friend Query operator ~(const Query &);
	friend Query operator |(const Query &, const Query &);
	friend Query operator &(const Query &, const Query &);
	friend std::ostream &operator <<(std::ostream &os, const Query &query) { return os << query.rep();};

public:
//	using QueryResult = TextQuery::QueryResult;
	Query(const std::string &s): q(new WordQuery(s)) {}  // 构建一个新的WordQuery
//	std::shared_ptr<Query_base>(new WordQuery(s))
	// 接口函数：调用对应的Query_base操作
	TextQuery::QueryResult eval(const TextQuery &t) {return q->eval(t);}
	std::string rep() const { return q->rep(); }

private:
	Query(std::shared_ptr<Query_base> query): q(query) {}
	std::shared_ptr<Query_base> q;  // 若改为内置指针，则不能再适用合成的版本（拷贝控制函数等）
};

#endif /* QUERY_H_ */
